#!/bin/sh
#desc:Base del sistema de desarrollo de OpenDomo


# Manual de SDK:
#@ OpenDomo SDK 
#@ ------------
#@ Este programa intenta simplificar la utilización de los scripts de OpenDomo
#@ complementándolos con mejores  explicaciones y verificaciones, accediendo a
#@ ellos desde un solo ejecutable.
#@
#@ La forma de emplear este ejecutable es indicando el comando a ejecutar como
#@ primer argumento (o emplear "help" para ver la lista de comandos) y,  si es
#@ necesario, añadir el resto de argumentos a continuación.
#@


if test -z "$ARCH"; then
	ARCH="arm"
fi

SVN="/usr/bin/svn"
BRPATH="http://buildroot.uclibc.org/downloads"
BRFILE="buildroot-2012.08"
HERE=`pwd`
#Module validation script
MVSCRIPT="opendomo-distro/tests/validatemodule.sh"
TODAY=`date +%d%m%y`
LOGDIR="$HERE/logs/$TODAY"

if test "$USER" = "root"; then
	echo "ERROR: No ejecute el SDK como superusuario. "
	echo "El propio SDK le solicitará la contraseña en caso de ser necesario."
	exit 1
fi

create_new_pkg() {
	mkdir -p $1/etc/opendomo/
	mkdir -p $1/usr/local/opendomo
	mkdir -p $1/var/opendomo/i18n
	mkdir -p $1/pkg
	echo -n "Código del paquete (p.e. odcgi):"
	read pkgname
	
	if test -f $1/mkpkg.sh; then
		echo "El archivo mkpkg.sh ya existe."
	else
		echo '#!/bin/sh
DATE=`date +%Y%m%d`
PKG="PKGNAME"
ARCH="noarch"
EXCLUSION=" --exclude \"*~\" --exclude .svn "
OWNERS=" --owner 1000 --group 1000 "
# make || exit 1
rm -f pkg/*.tar.gz
tar zcf  pkg/$PKG-$DATE.od.$ARCH.tar.gz etc usr var $OWNERS $EXCLUSION
' | sed "s/PKGNAME/$pkgname/" > $1/mkpkg.sh
	fi
	chmod +x $1/mkpkg.sh
	touch $1/TODO
	touch $1/README
	touch $1/CHANGES
	touch $1/var/opendomo/i18n/$pkgname.key
	touch $1/var/opendomo/i18n/$pkgname.es
	touch $1/var/opendomo/i18n/$pkgname.ca
	if ! test -f $1/pkg/$pkgname.desc; then
		echo -n "Describe el paquete en una frase: "
		read desc
		echo "$desc" > $1/pkg/$pkgname.desc
	fi
}

#@ Prerequisitos
#@ -------------
#@ Para poder emplear este script será necesario que dispongas de los paquetes
#@ siguientes instalados en tu equipo:
#@    build-essential locales-all subversion git-core make gcc qemu ncurses-dev g++ bison flex gettext texinfo
#@
#@ Si tu distribución es Debian o Ubuntu,  puedes emplear el comando "apt-get" 
#@ para instalar rápidamente todas las dependencias.
#@
PREREQS="subversion make gcc qemu ncurses-dev g++ bison flex gettext texinfo libjpeg-dev"
install_prereqs() {
	if test -f /usr/bin/apt-get ; then
		sudo apt-get install $PREREQS
	else
		echo "ERROR: apt-get command not found"
	fi
}

install_doc_prereqs() {
	PREREQS="$PREREQS doxygen graphviz"
	install_prereqs
}


#@ Primeros pasos
#@ --------------
#@ Si ha podido  ejecutar este script, probablemente  significa que dispone de 
#@ los archivos fuente de OpenDomo en su equipo. En todo caso, es recomendable
#@ empezar todo el proceso de desarrollo ejecutando la siguiente línea:
#@     # ./odsdk.sh update
#@ 
#@ Hecho esto, dispondremos de todos los archivos fuente necesarios para poder
#@ compilar nuestra distribución.  La misma operación deberá ejecutarse de vez
#@ en cuando para estar seguros de tener la última versión disponible.
#@

#@ Generación completa de una distribución OpenDomo
#@ ------------------------------------------------
#@ Una vez obtenido el código fuente, podremos proceder a crear una imagen ISO
#@ con la distribución OpenDomo. Los pasos esenciales a seguir son:
#@   1. # ./odsdk.sh update       (Obtener últimas versiones del código)
#@   2* # ./odsdk.sh brmc         (Seleccionamos las opciones del buildroot)
#@   3. # ./odsdk.sh brmake       (Compilamos buildroot y dependencias)
#@   4. # ./odsdk.sh packages     (Compilamos todos los paquetes OpenDomo)
#@   5. # ./odsdk.sh mkiso        (Creamos la ISO con paquetes y kernel creados)
#@
#@

process_command(){
    case $1 in
	deps)              ## Instala los paquetes prerequeridos
		install_prereqs 
	;;
	docdeps)           ## Instala los paquetes prerequeridos para la documentacion
		install_doc_prereqs
    ;;

	update)             ## Actualiza los archivos fuente y el buildroot		
		# Si ODSDK ha cambiado, le pasamos el flujo y salimos
		LU=`svn update odsdk.sh | wc -l`
		if test "$LU" -gt "1"; then
			./odsdk.sh update
			exit 0	
		fi
		# el script ODSDK seguro que es el más reciente. Seguimos...
		echo -n "  OpenDomo SVN ... " 
		svn update
		echo -n "  Buildroot ...    "
		if test -f ../$BRFILE.tar.gz; then
			echo "Up to date"
		else
			echo -n "(updating)"
			if wget "$BRPATH/$BRFILE.tar.gz" >/dev/null 2>/dev/null
			then
				mv $BRFILE.tar.gz ..
				cd ..
				if tar -zxf $BRFILE.tar.gz ; then
					rm -fr buildroot
					mv $BRFILE buildroot
					echo "Updated to $BRFILE"
					cd opendomo
				else
					echo "ERROR: archivo de buildroot $BRFILE inválido"
					return 1
				fi
			else
				echo "ERROR: no se pudo descargar"
				return 1
			fi
		fi
		if test -d ../arduino; then
			echo -n "  Arduino libs ... "
			cd ../arduino/libraries
			svn update
			cd ../hardware
			echo -n "  Arduino hard ... "
			svn update
			cd ..
			cd ../opendomo
		fi
		# Copiamos la configuración del buildroot para OpenDomo
		cp opendomo-distro/buildroot-config ../buildroot/.config
	;;
	br-menuconfig|brmc) ## Carga el menú de configuración del buildroot
		if test -d ../buildroot ; then
			cd ../buildroot
			cp -v ../opendomo/opendomo-distro/buildroot-config .config
			make menuconfig
			cp -v .config ../opendomo/opendomo-distro/buildroot-config 
			cd ../opendomo
		else
			echo
			echo "ERROR: El directorio de buildroot no existe. "\
				"Ejecute $0 update en primer lugar."
			return 1	
		fi
	;;
	br-make|brmake)     ## Compila el buildroot
		# Delete old filesystem. Buggy toolchain has problems re-using the old one
		#RASPBERRY
		#rm ../buildroot/output/images/rootfs.ext2
		if test -d ../buildroot; then
			cd ../buildroot
			echo "Esta operación puede tomar mucho tiempo."\
				"Por favor, sea paciente."
			cp -v ../opendomo/opendomo-distro/buildroot-config .config
			if ! test -f  .config.cmd; then
				make oldconfig
			fi
			if make ; then
				cp -v .config ../opendomo/opendomo-distro/buildroot-config 
				#cp -v output/build/linux-*/.config  \
				#	../opendomo/opendomo-distro/linux-config
				echo "A continuación se va a extraer el initrd para OpenDomo"
				echo "Es necesario ejecutar esta operación como root"
				cd ../opendomo/opendomo-distro/
				if ! test -d bootcd; then
					# La primera vez que se ejecuta, es necesario tener odpkg
					cd ../opendomo-pkg/
					./mkpkg.sh > /dev/null
					cd ../opendomo-distro/
					mkdir -p bootcd
				fi
				sudo ./process_initrd.sh
				cp drivers/*.tar.gz packages/
				cp drivers/*.desc packages/
			else
				echo "ERROR: El comando make ha fallado. "\
						"Revise la configuración"
				return 1
			fi
		else
			echo
			echo "ERROR: El directorio de buildroot no existe. "\
				"Ejecute $0 update en primer lugar."
			return 1
		fi
	;;


	kn-menuconfig|knmc) ## Carga el menú de configuración del kernel
# toolchain does not work well dealing with kernel config files. When they solve it, uncomment this:
#		if test -d ../buildroot; then
#			cd ../buildroot
#			make linux-menuconfig
#		fi

# In the meanwhile, we do it manually:
		cd opendomo-distro
		ODDIR=`pwd`
		cd ../../buildroot/output/toolchain/linux-*/
		KNDIR=`pwd`
		# Copying
		cp $ODDIR/linux-config $KNDIR/.config
		cd $KNDIR
		make menuconfig
		cp .config $ODDIR/linux-config
		cp .config ../../build/linux-*/
		cd $ODDIR
		rm ../../buildroot/output/build/linux-*/.stamp_built
		rm ../../buildroot/output/build/linux-*/.stamp_target_installed		
	;;

	kn-make|knmake) ## Compila únicamente el kernel
		HERE=`pwd`
		cd ../buildroot/output/toolchain/linux-*/
		THERE=`pwd`
		cp $HERE/opendomo-distro/linux-config $THERE/.config
		cp $HERE/opendomo-distro/linux-config $THERE/../../build/linux-*/.config
		cd $THERE
		# Deleting .stamp_built forces kernel compilation
		rm ../../build/linux-*/.stamp_built
		rm ../../build/linux-*/.stamp_target_installed		
		make
		cp $THERE/.config $HERE/opendomo-distro/linux-config 
		cd $HERE
	;;

	lang)               ## Actualiza los archivos de idioma 
		rm -fr $HERE/opendomo-distro/sysconf/etc/opendomo/langfiles/*
		echo "Obtaining language files..."
		URL="http://www.opendomo.org/trans.php?&modules=all"
		TDIR="$HERE/opendomo-distro/sysconf/etc/opendomo/langfiles"
		wget -q "$URL&lang=es" -O $TDIR/es
		wget -q "$URL&lang=key" -O $TDIR/key
	;;


	newpackage)         ## Crea/actualiza un paquete para OpenDomo
		if test -z "$2"; then
			echo "ERROR: Debe especificar el nombre del paquete."
			return 1
		else
			if test -d "$2"; then
				echo "ERROR: El directorio $2 ya existe."
				return 1
			else
				create_new_pkg $2
			fi
		fi
	;;	
	release|mkiso)      ## Genera una ISO con el linux compilado, o una release
		cd opendomo-distro
		#RASPBERRY
		#rm -fr bootcd/packages/*
		rm -fr /mnt/opendomo/packages/*
		if sudo ./create_iso.sh $2
		then
			echo "ISO generada"
		else
			echo "ERROR: No se ha podido generar la ISO."
			echo "Es posible que no se encuentre alguno de los paquetes."
			echo "Ejecute el comando 'pkg' para generarlos."
		fi
		cd ..
	;;

	packages|pkg)       ## Empaqueta todos los paquetes internos de OpenDomo
		mkdir -p $LOGDIR
		#rm -f opendomo-distro/packages/od*.gz
		echo "Creando paquetes..."
		for s in *; do
			if test -x $s/mkpkg.sh; then
				PKGNAME=`echo "$s                " | cut -b1-20`
				echo -n "  $PKGNAME	"
				cd $s
				if ./mkpkg.sh >$LOGDIR/$s.log 2>>$LOGDIR/$s.err; then
					P=`ls pkg/*.gz | head -n 1` 2>/dev/null
					if ! test -z "$P"
					then
					../$MVSCRIPT $P > $LOGDIR/$s.pkg-val.err
					WARN=`grep WARNING $LOGDIR/$s.pkg-val.err |wc -l` 2>/dev/null
						if test $WARN -gt 0; then
							echo " OK ($WARN warnings, see $s.pkg-val.err)"
						else
							echo " OK"
						fi
					else
						echo " FAILED (package missing)"
					fi
				else
					echo " FAILED"
					break
				fi
				cd ..
			fi
		done
		echo "Note: the log files can be found in $LOGDIR"
	;;
	lspkg|listpackages) ## Muestra un listado con los paquetes preparados
		echo "Paquetes preparados:"
		for i in ./opendomo-distro/packages/*.tar.gz; do
			echo "  `basename $i`"
		done
	;;
	rmpkg|rmpackages)   ## Borra los paquetes creados
		rm opendomo-distro/packages/*
	;;

	docs)               ## Genera la documentación del sistema
		if test -x /usr/bin/doxygen; then
			mkdir -p $LOGDIR
			# Por si no existe, creamos el directorio "docs"
			mkdir -p docs
			for d in * */*; do
				if test -d "$d"; then
					if test -f $d/doxygen.cfg; then
						PKGNAME=`echo "$d                        " | cut -b1-30`
						echo -n "# Processing $PKGNAME "
						L=`basename $d`
						/usr/bin/doxygen $d/doxygen.cfg > $LOGDIR/$L.doc-err 2>&1
						WARNINGS=`grep Warning $LOGDIR/$L.doc-err | wc -l`
						if test $WARNINGS -gt 0; then
							echo "($WARNINGS warnings, see $L.doc-err)"	
						else
							echo
						fi
					fi
				fi
			done
			echo "Note: the log files can be found in $LOGDIR"
		else
			echo "ERROR: /usr/bin/doxygen missing"
		fi
	;;
	man)                ## Muestra el manual del ejecutable
		echo
		sed -ne '/#@/ {/sed/d;s/#@/ /g;p}' $0 | less
	;;
	clear)
		clear
	;;
	help)
		echo
		echo "Comandos soportados:"
		sed -ne '/##/ {/sed/d;s/^\t/   /;s/##/\t/g;s/|/,/g;p}' $0
	;;
	quit|exit)
	        exit 0
	;;
   esac
   echo 
}

#@ Intérprete de comandos OD SDK
#@ -----------------------------
#@ Si no se ha especificado ningún argumento accederemos a la línea de comandos
#@ que nos proporcionará  un entorno simplificado y ágil  para trabajar con las
#@ herramientas de OpenDomo.
#@ 
if test -z "$1"; then
	HERE=`pwd`
	
	echo "Intérprete de comandos de OpenDomo SDK. "
	echo "Usa Ctrl+C, 'quit' o 'exit' para regresar a la línea de comandos"\
	     " o 'help' para ver todos los comandos disponibles."
	while(true); do
		cd $HERE
		echo -n "ODSDK> "
		read line
		var1=`echo $line | cut -f1 -d' '`
		var2=`echo $line | cut -f2 -d' '`
		process_command $var1 $var2
	done

else
	if ! process_command $1 $2; then
		exit 1
	fi
fi
